PHASE 1 · LINUX 网络栈实战

1.2iproute2 核心四件套

ip link / addr / route / rule

1.1 你认全了接口,而且已经用了不少 ip 命令。这章把 iproute2 这套工具系统讲清——它的四个核心子命令 link / addr / route / rule,恰好对应 Phase 0 学的几层:配接口、配地址、配路由、配"选哪张路由表"。学完这四件套,一台 Linux 的网络行为你就能徒手全盘掌控。

一句话定义

iproute2:Linux 现代的网络配置工具集,核心命令 ip 用统一的"对象 + 动作"语法,管接口、地址、路由、策略——取代了老旧的 ifconfig / route / netstat。

ip link接口设备本身:up/down、MTU、MAC、建虚拟接口↔ 0.2 链路层
ip addr给接口绑 IP(带 /CIDR 前缀)↔ 0.3 IP 地址
ip route路由表:目标网段 → 下一跳↔ 0.3 路由表 / LPM
ip rule选哪张路由表(策略路由)★ 本章新概念

1iproute2:一个命令统管网络栈

老一套工具(net-tools)各管一摊、且已停止维护:ifconfig 管接口/地址、route 管路由、netstat 管连接、arp 管 ARP 表。新一套 iproute2 用一个 ip 全包了,功能还更全(策略路由、多路由表这些老工具根本做不了)。语法统一成:

语法
ip [选项] 对象 动作 [参数]
#        ↑link/addr/route/rule…   ↑show/add/del/set…

对象就是四件套 link / addr / route / rule(还有 neigh、netns 等,0.2/0.3 你已用过 ip neighip netns)。动作通常是 show / add / del / set。给知道 ifconfig 的人一张新旧对照:

你想做的老命令(已弃)iproute2
看接口 / 地址ifconfigip addr
启用接口ifconfig eth0 upip link set eth0 up
看路由表route -nip route
加路由route add …ip route add …
看 ARP / 邻居arp -aip neigh
看连接netstat -tnss -tn
记一个心智模型

ip 后面第一个词先回答"我要操作哪一层的对象":link 是接口(二层设备),addr 是地址(三层),route 是转发表,rule 是"选表的规则"。下面就按这个顺序展开。

2ip link:接口本身

ip link 操作接口这个"设备"本身——启停、改名、改 MTU、改 MAC,不碰 IP

bash
ip link show                                  # 列出接口(1.1 用过)
ip link set eth0 up                           # 启用 / down 禁用
ip link set eth0 mtu 1400                      # 改 MTU(回想 0.2 的 1500)
ip link set eth0 address 02:11:22:33:44:55     # 改 MAC(0.2 说的可改/伪造)
ip link set eth0 down && ip link set eth0 name wan0   # 改名(需先 down)

关键:ip link 管的是"这块网卡开不开、MTU 多大、MAC 是什么、叫什么名",不涉及 IP。给它配 IP 是下一个命令的事。

路由器关联 router-link

1.1 造 bridge / veth / vlan,用的全是 ip link(ip link add … type bridge/veth/vlan)。netifd 在路由器上配接口,底层就是一连串 ip link 调用——先把设备建起来、配好,再交给后面的命令配地址和路由。

3ip addr:给接口配地址

ip addr 把 IP 地址(带 CIDR 前缀)绑到接口上。回想 0.3:IP + 子网掩码(/24)。这里就是把它配到接口:

bash
ip addr show                                  # 看所有接口地址(简写 ip a)
ip addr add 192.168.1.10/24 dev eth0           # 配一个地址(/24 就是 0.3 的掩码)
ip addr add 192.168.1.11/24 dev eth0           # 同一接口再配一个 → 一机多址
ip addr del 192.168.1.10/24 dev eth0           # 删
解开 0.3 那条 "scope link" 之谜

配地址时带 /24,内核会自动给这个接口添一条直连路由。0.3 实验里 h1 路由表那条 10.0.1.0/24 dev v-h1 proto kernel scope link,就是 ip addr add 顺手生成的——你只配了地址,内核替你把"这个网段直连可达"的路由也加上了。地址和直连路由,本就是绑在一起的。

4ip route:决定包往哪走

ip route 操作路由表——0.3 那张"目标网段 → 下一跳"的表,按 longest prefix match 选路。现在你亲手操作它:

bash
ip route show                                 # 看路由表(简写 ip r);0.3 读过它的输出
ip route add 10.0.2.0/24 via 192.168.1.1       # 去 10.0.2.0/24 交给网关
ip route add default via 192.168.1.1 dev eth0  # 默认路由(0.3 的 default = 0.0.0.0/0)
ip route del 10.0.2.0/24                         # 删
ip route get 8.8.8.8                            # 神器:问内核“这目标会怎么走”

ip route get 特别有用:你不用自己推,直接让内核告诉你某个目标 IP 会匹配哪条路由、从哪个接口出、下一跳是谁——把 0.3 的 longest prefix match 当场演示出来。还记得 0.3 实验里 ip -n h1 route add default via 10.0.1.1 吗?正是这个命令,在 namespace 里加默认路由让 h1 能出网段。

路由器关联 router-link

路由器的核心工作就是维护这张表。WAN 口从 DHCP / PPPoE 拿到的那条默认路由,本质就是一条 ip route add default via <ISP 网关>。但如果你想做更细的控制——某些流量走这条线、某些走那条——只靠目的 IP 不够了,就轮到下一个命令。

5ip rule:选哪张路由表(策略路由)

这是四件套里唯一的新概念(前三个 Phase 0 都铺过)。ip rule 决定"一个包该查哪张路由表"——让你能按源地址、按标记走不同的路,而不只看目的地。

默认系统只用一张主表(main),所有包都按目的 IP 查它(0.3 那套)。但有时你想:来自某个网段的流量走线路 A、其余走线路 B——这叫策略路由(policy routing),目的 IP 一样也能走不同路。机制是:可以有多张路由表(每张都是 0.3 那样一套规则);ip rule 是一串按优先级匹配的"规则",决定一个包去查哪张表。

bash
ip rule show                                  # 看规则(默认有 local / main / default 三条)

# 例:让来自 192.168.50.0/24 的流量,改查 100 号表
ip route add default via 10.0.0.1 table 100    # ① 在 100 号表里放一条默认路由
ip rule add from 192.168.50.0/24 table 100     # ② 加规则:这个源网段查 100 表
ip route get 8.8.8.8 from 192.168.50.1         # ③ 验证:带上源地址看它走哪条

匹配条件不止源地址,还能按入接口(iif)、防火墙标记(fwmark,标记由 nftables 打,1.3 讲)。典型用途:多 WAN 分流、VPN 分流(某些流量走 wg0、其余走默认)、DNS 分流的底层之一。

类比:ip rule 是路由前的一组 if 判断

把 main 表想成默认的路由函数,ip rule 就是前置的一串 if:if 源地址匹配 → 用这张表;else → 用那张表。它在 0.3 的"查路由表"之前,先决定"查哪张路由表"。多了这一层,目的地相同的包也能被分流到不同线路。

路由器关联 router-link

本课程后面 2.7 的策略路由、DNS 分流、透明代理,底层全靠 ip rule + 多路由表 + fwmark(标记由 nftables 打,1.3 讲)。这也是家宽多线负载均衡、按域名/IP 分流的核心机制——OpenWRT 的相关功能,最终都落到这套内核能力上。

本章小结

  • iproute2 的 ip 用"对象 + 动作"统管网络栈,取代 ifconfig / route / netstat;对象即四件套。
  • ip link:接口设备本身(up/down、MTU、MAC、改名、建虚拟接口);不碰 IP。
  • ip addr:把带 CIDR 的 IP 绑到接口;顺带自动生成直连路由(解开 0.3 那条 scope link 之谜)。
  • ip route:操作路由表(0.3),ip route get 直接看 LPM 选路结果。
  • ip rule:策略路由——按源 / 标记选"查哪张表",在"查路由"之前多一层判断;多 WAN、VPN 分流的核心。
  • 心智模型:link 配设备 → addr 配地址(+直连路由) → route 配转发 → rule 配选表规则。

动手练习

  1. ip route get 8.8.8.8ip route get 127.0.0.1,对照输出说出:各走哪个接口、下一跳是谁、为什么(回想 0.3 的 default vs 直连)。
  2. 给一个接口临时加一个第二地址(ip addr add …/24 dev …),用 ip addr 确认有了两个 IP;再 ip route 看是否多了一条直连路由;清理掉。
  3. 思考题:ifconfigip addr 都能看地址,为什么本课程一律用 ip?(提示:net-tools 停维护 + 策略路由 / 多表这类功能它根本做不了。)
  4. 进阶:用 ip rule + 一张自定义表做一个最小策略路由,让带某个 from 源地址的 ip route get 走一条和默认不同的路由,观察 from 参数怎么改变结果。